package com.binc.testspring.common.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 不同之处：
 * 1 排序规则实现的方法不同
 * Comparable接口的方法：compareTo(Object o)
 * Comparator接口的方法：compare(T o1, To2)
 *
 * 2 类设计前后不同
 * Comparable接口用于在类的设计中使用；设计初期，就实现这个借口，指定排序方式。
 * Comparator接口用于类设计已经完成，还想排序（Arrays）。
 *
 * int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”，意味着“o1比o2小”；返回“零”，意味着“o1等于o2”；返回“正数”，意味着“o1大于o2”
 *
 * Comparable相当于“内部比较器”，而Comparator相当于“外部比较器”。
 *
 * 两种方法各有优劣， 用Comparable 简单， 只要实现Comparable 接口的对象直接就成为一个可以比较的对象，但是需要修改源代码。
 * 用Comparator 的好处是不需要修改源代码， 而是另外实现一个比较器， 当某个自定义的对象需要作比较的时候，把比较器和对象一起传递过去就可以比大小了， 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑，使其可以匹配一些比较简单的对象，可以节省很多重复劳动。
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Bird  implements Comparable<Bird>{

    int age;
    String name;



    @Override
    public int compareTo(Bird o) {

        return this.age - o.age;
    }

    public static void main(String[] args) {

        List<Bird> list = new ArrayList<>();
        list.add(new Bird(2, "2s"));
        list.add(new Bird(1, "1s"));
        list.add(new Bird(0, "0s"));
        list.add(new Bird(5, "5s"));
        System.out.println(list);
        System.out.println("------------------");
        Collections.sort(list);
        System.out.println(list);// 由于Bird实现了Comparable 并重写了compareto方法；所以Bird的集合能够用collections.sort进行比较排序了；
        System.out.println(list);
        System.out.println("=================");
        list.sort(Comparator.comparing(Bird::getAge).reversed());  // 加入Bird没有实现Comparable的话，Bird的集合无法进行排序的（不知道按照什么排），所以这里是利用了自定义的比较器进行比对排序；
        System.out.println(list);



    }
}
